#include "bsp_int.h"
#include "bsp_beep.h"
#include "bsp_delay.h"

sys_irq_handler_t irq_table[NUMBER_OF_INT_VECTORS];


void int_init(void)
{
	/* 初始化GIC */
	GIC_Init();

	/* 设置中断向量表基地址VBAR */
	__set_VBAR(0x87800000U);

	/* 初始化irq_table为默认irq处理函数 */
	system_irqtable_init();
}

/* IRQ通用中断驱动函数处理入口 */
void system_irqhandler(unsigned int gicc_iar)
{
	unsigned int irq = gicc_iar & 0x3ff;	/* GICC_IAR bit[9:0]是中断ID */

	if(irq>=0 && irq <160){
		irq_table[irq].irqHandler(irq, irq_table[irq].userParam);
	}
}

/* 注册IRQ中断id的中断处理函数 */
void system_irqhandler_register(IRQn_Type irq, system_irq_handler_t handler, void *userparam)
{
	if(irq>=0 && irq <160)
	{
		irq_table[irq].irqHandler = handler;
		irq_table[irq].userParam = userparam;
	}
}

/* 默认irq处理函数，函数体中没有内容之后一个空循环 */
void default_irqhandler(IRQn_Type irq, void *userparam)
{
	int state = 0;
	
	while(1){
		state = !state;
		beep_switch(state);
		delay(500);
	}
}

/* 初始化irq_table表 */
void system_irqtable_init(void)
{
	int i = 0;

	for(i=0; i<NUMBER_OF_INT_VECTORS; i++)
	{
		irq_table[i].irqHandler = default_irqhandler;
		irq_table[i].userParam = NULL;
	}
}